package persistence;

import java.rmi.RemoteException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.rpc.ServiceException;

import org.tempuri.PublicoLocator;
import org.tempuri.PublicoSoapStub;

import model.Glossario;
import model.Login;
import model.Termo;

public class TermosDaoImpl implements TermosDao {

	Connection c;
	
	public TermosDaoImpl(){
		GenericDao gDao = new GenericDao();
		c = gDao.getConnection();
	}
	
	@Override
	public String cadastraTermo(Termo t) throws SQLException {
		String sql = "{call sp_glossario (?,?,?,?,?,?,?,?,?)}";
		CallableStatement cs = c.prepareCall(sql);
		cs.setString(1, "I");
		cs.setNull(2, java.sql.Types.INTEGER);
		cs.setString(3, t.getRa());
		cs.setString(4, t.getNomeTermo());
		cs.setString(5, t.getTermo());
		cs.setString(6, t.getNomeTermoOriginal());
		cs.setString(7, t.getTermoOriginal());
		cs.setString(8, t.getFonte());
		cs.registerOutParameter(9, java.sql.Types.VARCHAR);
		cs.execute();
		String saida = cs.getString(9);
		cs.close();
		return saida;
	}

	@Override
	public String editaTermo(Termo t) throws SQLException {
		String sql = "{call sp_glossario (?,?,?,?,?,?)}";
		CallableStatement cs = c.prepareCall(sql);
		cs.setString(1, "U");
		cs.setInt(2, t.getId());
		cs.setString(3, t.getRa());
		cs.setString(4, t.getTermo());
		cs.setString(5, t.getTermoOriginal());
		cs.registerOutParameter(6, java.sql.Types.VARCHAR);
		cs.execute();
		String saida = cs.getString(6);
		cs.close();
		return saida;
	}

	@Override
	public String excluiTermo(Termo t) throws SQLException {
		String sql = "{call sp_glossario (?,?,?,?,?,?,?,?,?)}";
		CallableStatement cs = c.prepareCall(sql);
		cs.setString(1, "D");
		cs.setInt(2, t.getId());
		cs.setNull(3, java.sql.Types.VARCHAR);
		cs.setNull(4, java.sql.Types.VARCHAR);
		cs.setNull(5, java.sql.Types.VARCHAR);
		cs.setNull(6, java.sql.Types.VARCHAR);
		cs.setNull(7, java.sql.Types.VARCHAR);
		cs.setNull(8, java.sql.Types.VARCHAR);
		cs.registerOutParameter(9, java.sql.Types.VARCHAR);
		cs.execute();
		String saida = cs.getString(9);
		cs.close();
		return saida;
	}

	@Override
	public List<Glossario> listaTermos(Login l) throws SQLException {
		List<Glossario> lista = new ArrayList<Glossario>();
		String nomeAluno = nomeAluno(l);
		String sql = "SELECT [id_termo],[ra_aluno],[termooriginal],[termo],[nometermo],[nometermooriginal],[fonte] FROM [glossarioingles].[dbo].[glossario] WHERE [ra_aluno] = ?";
		PreparedStatement ps = c.prepareStatement(sql);
		ps.setString(1, l.getSenha());
		ResultSet rs = ps.executeQuery();
		while (rs.next()){
			Glossario g = new Glossario();
			g.setIdTermo(rs.getInt("id_termo"));
			g.setNomeAluno(nomeAluno);
			g.setRa(rs.getString("ra_aluno"));
			g.setTermo(rs.getString("termo"));
			g.setTermoOriginal(rs.getString("termooriginal"));
			g.setNomeTermo(rs.getString("nometermo"));
			g.setNomeTermoOriginal(rs.getString("nometermooriginal"));
			g.setFonte(rs.getString("fonte"));
			lista.add(g);
		}
		return lista;
	}
	
	private String nomeAluno(Login l){
		Login login = new Login();
		List<Login> listaAlunosCadastrados = new ArrayList<Login>();
		PublicoLocator locator = new PublicoLocator();
		try {
			PublicoSoapStub client = (PublicoSoapStub) locator.getPublicoSoap();
			String[] turma = client.pessoasTurma("4733", "005", "24884", "1234");
			String tokenVelho = client.tokenPropriedade();
			String tokenNovo = "\n";
			
			for (int i = 0 ; i < turma.length ; i++){
				String linha = turma[i];
				linha = linha.replace(tokenVelho, tokenNovo);
				turma[i] = linha;
			}
			
			for (String s : turma){
				Login alunoCadastrado = new Login();
				String[] pessoa = s.split(tokenNovo);
				for (String st : pessoa){
					if (st.contains("Nome")){
						alunoCadastrado.setNomeCompleto(st.replace("Nome=", ""));
					}
					if (st.contains("Registro")){
						alunoCadastrado.setSenha(st.replace("Registro=", ""));
					}
				}
				listaAlunosCadastrados.add(alunoCadastrado);
			}
			login = autentica(l, listaAlunosCadastrados);
		} catch (ServiceException | RemoteException e) {
			e.printStackTrace();
		}
		return login.getNomeCompleto();
	}

	private Login autentica(Login u, List<Login> listaCadastrados) {
		for (Login usuario : listaCadastrados){
			if (usuario.getSenha().equals(u.getSenha())){
				u.setNomeCompleto(usuario.getNomeCompleto());
				break;
			}
		}
		return u;
	}

	@Override
	public ResultSet listaTermosGrupo(int codigoGrupo)
			throws SQLException {
		List<Glossario> lista = new ArrayList<Glossario>();
//		String nomeAluno = nomeAluno(l);
		String sql = "SELECT [glossario].[id_termo],[glossario].[termooriginal],[glossario].[termo],[glossario].[nometermo],[glossario].[nometermooriginal],[glossario].[fonte],[grupo].[codigo] FROM [glossario] INNER JOIN [grupo] ON [glossario].[ra_aluno] = [grupo].[ra] WHERE [glossario].[ra_aluno] IN (select ra from grupo where codigo = ?)";
		PreparedStatement ps = c.prepareStatement(sql);
		ps.setInt(1, codigoGrupo);
		ResultSet rs = ps.executeQuery();
//		while (rs.next()){
//			Glossario g = new Glossario();
//			g.setIdTermo(rs.getInt("id_termo"));
////			g.setNomeAluno(nomeAluno);
////			g.setRa(rs.getString("ra_aluno"));
//			g.setTermo(rs.getString("termo"));
//			g.setTermoOriginal(rs.getString("termooriginal"));
//			g.setNomeTermo(rs.getString("nometermo"));
//			g.setNomeTermoOriginal(rs.getString("nometermooriginal"));
//			g.setFonte(rs.getString("fonte"));
//			g.setCodigoGrupo(rs.getInt("codigo"));
//			lista.add(g);
//		}
		return rs;

	}	
	
}
